約 4,455,176 件
https://w.atwiki.jp/webmarketingyougo/pages/57.html
コンパイラ言語とは、高水準プログラミング言語の分類の一つで、公式の、あるいは主要な実行環境がコンパイラ(compiler)であるような言語のこと。 コンパイラはプログラミング言語で記述されたソースコードを解釈し、実行可能な機械語(マシン語)などのコードに一括して変換するソフトウェアで、変換後のコードを元に実行可能ファイルを作成して実行される。記述したコードを実行に移すまでに手間や準備時間が必要だが、機械語への変換と実行が分離されるため、プログラムを少ない消費メモリで高速に実行でき、実行時にソースコードが不要(利用者へソースコードを提供しなくてよい)という特徴がある。 コンパイラ言語は言語の開発元が提供する公式の処理系や、広く普及している主要な処理系がコンパイラであるような言語を指し、機械語コードへ変換しながら同時に実行する「インタプリタ言語」(インタプリタ型言語)と対比される。 このような分類は現代よりもプログラミング言語とその処理系が密接に関連付けられていた1990年代以前によく用いられたが、インタプリタとコンパイラのどちらを用いるかは言語そのものの特性ではなく、実際、今日では一つの言語に両者が標準的に提供されることも少なくないため、このような分類を用いることはほとんどなくなった。
https://w.atwiki.jp/sevenlives/pages/1511.html
JITコンパイラ 読み:じっとこんぱいら 英語:Just In Time Compiler 別名:ジャストインタイム・コンパイラ 意味: JITコンパイラとはプログラムの実行時に一定のまとまりでコンパイルする方法のこと。通常のコンパイラのように実行前に行わずに事前に行うことからAhead Of Time(AOT)と呼ばれます。 インタープリタ型に比べ繰り返しの作業などは実行速度が高速になるという利点があります。 Javaはバイトコードからインタープリタ式で実行されていたがJITコンパイラを取り入れることによって高速化を実現している。 2009年10月07日 AOT? インタープリタ? JavaScript JIT
https://w.atwiki.jp/mopsprogramming/pages/155.html
プログラミング言語で組んだプログラムをコンピュータで実現するとき、その実行方法には、大きく分けて二つの方法があります。それが、インタープリタ方式とコンパイラ方式です。インタープリタとは「解釈するもの(Interpreter)」というような意味の英語です。コンパイラ(Compiler)の意味は難しいですね。英語の辞書も大抵翻訳を放棄して、カタカナ書きです。語の成り立ちからすると「束ねて積み込むもの」というイメージでしょうか(想像するに、穴空きカードでプログラミングしていた時代の名残じゃないでしょうか)。 ソフトェア/ハードウェア インタープリタにしてもコンパイラにしても、そう呼ばれるのは、その機能を持ったソフトウェア(アプリケーション)のことです。そういえば、ソフトウェアとハードウェアの話をしていませんでした。ついでにここで触れると、コンピュータとか機械のことはハードウェア(Hardware)と呼ばれ、それを動かすためのコードやデータの中身(コードは機械への命令ですが、これも大きく括れば計算機に食わせるデータの一つ)をソフトウェア(Software)といいます。機械は硬い(ハード hard)ので、それとの対比でソフトなわけで、別に柔らかいわけじゃありません、っていうか、厳密にいうと手では触れません、ソフトウェアには。 さてインタープリタ方式とコンパイラ方式に話を戻します。前回も触れたように、機械の中では、普通の人間にはわけが分からない電気信号(機械語)の組み合わせが飛び交っているに過ぎません。これを人にもわかりやすいようにするためにプログラミング言語があるわけです。ですが、今度は機械の方でプログラミング言語を直接理解(つまり、対応した実行。機械が何かを"理解"することは、今のところありません。比喩です。)できません。そんなわけで、プログラミング言語で書いたプログラムを、機械が理解できるような信号に変換してくれるものが必要なわけです。これがインタープリタとかコンパイラなわけです。 インタープリタ方式 インタープリタは、プログラミング言語で書かれたプログラムを読み込んで、直ちにそれを機械への命令に変換して実行してくれます。ですから、インタープリタ方式では、プログラムのごく一部分であっても、ある程度まとまっていれば、その場で実行して結果を確かめることができます。簡単便利なわけです。ところが、反面、前回も触れたような行ったり来たりの構文解析をしたり、さらに数式みたいな外見の文の意味を機械の命令に翻訳したりという作業を、一行毎にしながら実行して行くため、高速の処理が苦手です。もっとも最近は機械自体の処理速度がめちゃくちゃ早くなっているので、特別高速処理が必要な部分じゃなければ、インタープリタ方式でも苦痛なほど鈍いということはないようです。そのため、簡便性が買われて、インタープリタ方式しか提供されていない言語もかなり広く愛好されるようになりました。 コンパイラ方式 これに対して、コンパイラは、それ自体はプログラムを実行してくれません。プログラミング言語で書かれたプログラムを、機械が理解できるデータに変換して、普通はそれをファイルとして保存するということをします。この生成されたファイルはいわゆるアプリケーションになっているはずなわけで、これを実行すればいいわけです。実行の段階では、もう構文解析とか機械語への翻訳は終わっているので、最適な実行速度が得られるわけです。ところが、コンパイラ方式の場合、実行するファイルはアプリケーションとしてある程度完成していないといけないわけで、足し算の部分だけ、とかを試してみることができません。そんなわけで、あらかた完成してから、デバッグと呼ばれる手順で、専用のアプリケーション(デバッガという)を用いてときどき止めながら実行してみて、長いプログラムの中にちりばめられた多くの失敗を捜す必要もでてきます。インタープリタのように書きながら断片毎にチェックできればミスのありかもわかりやすいのですが、それができない、ということです。それでも、実行速度が欲しい商用のアプリケーションはもちろん、ごく普通にアプリケーションというと、コンパイラ方式でつくられたものがほとんどです。本格的、というイメージがあるのかもしれません。 すこし補足します。上で"コンパイラというソフトウェア"といいましたが、これは、ちょっと広い範囲のものを含んでいます。まあ、この広い意味のコンパイラという言い方も、そう特殊ではないんですが。厳密にいうと、コンパイラは、プログラミング言語で書かれたプログラムを、マシン語の命令の束に変換するところまでをするソフトウェアで、その結果をファイルに落としたとしても、必ずアプリケーションになるとは限らないわけです。この後アプリケーションに至るプロセスの中で重要な働きをするソフトウェアはリンカ(linker)と呼ばれます。特に、スタティック(static)リンカですね。静的リンカ。だいたいは、これも合わせてコンパイラというわけです。 少し細かい話ですが、プログラムを書くとき、複数のファイルにわけて書くのが普通です。狭い意味でのコンパイラというのは、このプログラムファイル毎に、ひとつのマシン語ファイルを生成するのが普通です。で、自分のところで内容がわからない(定義されていない)サブルーチン、と定義されているサブルーティンとにわけて、タップというか継ぎ手みたいな記号をファイルに書き込んでおくわけです。そのあと、スタティックリンカは、その継ぎ手を調べて、定義内容と、それを必要としている部分を結びつけた上で、ひとつの実行可能ファイルにまとめてくれるわけです。実は、Mops/Forthではこの作業はないんですが、"普通の"コンパイラ型言語では、だいたいこういう仕組みになっていると思います。 ファイルを別々にわけたまま、とりあえずは実行できるようにしておいて、必要になったときに"継ぎ手"を調べて結びつける仕事をするソフトウェアは、ダイナミック(dynamic)リンカと呼ばれます。動的リンカですね。 この手の話は、高度な話ということになってるんですが、まあ、発想は単純ですよね。仕組みを作るのは難しそうですが。面倒なら、あまり考えなくていいです。 バイトコード方式 で、以上のようなものは両極で、中間にいろいろ技巧をこらしているものがあります。その中でも、今ではJavaのせいで触れないわけにはいかなくなった、バイトコード方式というのがあります。つまり、インタープリタ方式とコンパイラ方式の中間にあるような方法です。 この方式では、プログラミング言語で書かれたプログラムは、まずコンパイル(コンパイラで変換すること)される必要があります。しかし、ここで一挙に機械語に変換はしません。バイトコードと呼ばれる、人間には読めない、しかし機械で直接実行もできないデータに変換するのです。これは、大抵、ファイルとして保存されます。出来上がったファイルは、このデータのインタープリタで実行されます。このインタープリタは、"仮想機械(バーチャルマシン virtual machine)"と呼ばれるのが普通です。 なお、バイトコードというのは厳密には、Java(他にはSmalltalkという言語でも)で使われる実行ファイルデータの呼び名(型式名)で、別に、この方式を採用するのに、バイトコードというタイプを使う必然性はありません。ので、正確には、中間コード方式とでもいう方がいいでしょう。まあ、Javaが有名なもので。 バイトコードはプログラミング言語の構文解析はもう終わっており、手早く機械語に変換できるようになっています。ですから、インタープリタ(仮想機械)で実行するときには、直接機械語を実行するとき程ではありませんが、比較的高速になります。他方、コンパイルが必要ですから、断片を手軽に試すということもできません(直接ソースを実行できるインタープリタもあるかも知れません。すみません。商品状況はよく知りません。ちょっとずつ追加コンパイルできるようになっていれば、かなり好いわけですが。)。 すると、見方によっては、インタープリタ方式ほどの手軽さもなく、コンパイラ方式よりも実行速度が遅い、いいところないじゃないか、といえなくもありません。ですが、このバイトコード方式の狙いは、皆さんご承知のように、違うところにあるのです。インタープリタ方式は、インタープリタというアプリケーションが、プログラムをその機械やOSに合わせて実行してくれるわけで、"理想的には"どの機械、どのOSでも、同じプログラムを同じように動かせるはずなわけです。ところが、あまりに実行速度が遅いのではイライラする。そこで、手早く機械語に変換できる言語をつかってインタープリタで動かせば、違う機械、違うOSでも、"理想的には"一つのプログラムが比較的高速で同じように動かせるじゃあないか、ということになるわけです。つまり、機械、というか特にOSの違いの吸収がその目的なわけです。もっとも、機械語に変換しやすいバイトコードは、人間にわかりやすいとはいえない。そこで、コンパイラをかませて、人にもわかりやすいコードをバイトコードに変換するという機構もつけたわけです。Javaは商業的にも大成功した、みたいです。 言語の特性とは言い切れない インタープリタ方式、コンパイラ方式、中間方式、どれもプログラムの実行方式です。ときどき、インタープリタ言語、コンパイラ言語、などという分類がありますが、インタープリタでするかコンパイラでするかは、厳密にはプログラミング言語の属性ではありません。実際、C言語やC++言語というのはコンパイラ言語のチャンピオンですが、どちらもインタープリタが存在しています(過去形の方がいいのかな。あまり知られていませんね。学習用ということでしょう。)。ただ、全然関係ないかというと、そうでもありません。というのは、何度か触れたように、インタープリタでは構文解析とか、プログラミング言語を機械に適切なように置き換えるプロセスが実行されます。インタープリタ上で動かすことを予定して言語をデザインするには、この時間を最小限にするのが理想的ということになります。もちろん、人が読めるという条件を前提としてですが。他方、コンパイラ方式で動かすというなら、この変換にかかる時間は、あまりに長いのは問題ですが、それほど大きな意味を持ちません。どちらかというと、機械語の実行コードの実行効率を上げることができるような言語デザインが大切になってきます。コンパイラ方式の最大の利点は効率性ですから。つまり、プログラミング言語をデザインするときには、どちらを前提とするかで考え方が違ってくるわけで、言語の見た目も変わってくる可能性はあるわけです。もっとも、実際には、インタープリタ言語は機械のパワーに依存してしまっていて、コンパイラ言語と変わらない体裁のものがほとんどですし(似ている方がおぼえやすいし)、コンパイラ言語は、言語デザインで効率性を考えるというより、コンパイラ技術に依存してしまっているわけですが。 Mopsの方式 Mopsは、インタープリタであると同時にコンパイラでもあります。じゃあバイトコード(中間コード)方式なのかというと、そうでもありません。インタープリタ方式とコンパイラ方式の中間ではないのです。強いていえば、インタープリタのようにコード断片を試せるコンパイラ方式です。 Mopsには定義されているものと定義されていないものがあります。簡単な足し算"+"などは予め定義されています。自分で新たに定義を付け加えることもできます。既に定義されているものは、Mopsのウィンドウにenterすると実行されます。これはインタープリタの動作です。ところが、この解釈実行の段階にはコードを機械語に変換するという部分がありません。定義したときに、もうその内容は機械語に変換されて辞書(Dictionary)と呼ばれるメモリー部分に格納されてあるのです。インタープリタは、それを引っ張り出して実行するだけです。ですから、既に定義されている部分を実行している間は、機械語を単純に実行しているだけなのです。ですから、実行方式は、コンパイラ方式での実行ファイルの実行と変わりがありません。そのため、インタープリタ方式とは思えない程高速なのです。Mopsの方式は、Forth系言語の中でも、ネイティブ方式と呼ばれ、最も高速な部類に属します。これは、実質的には、もう、インタープリタ方式とはいえません。コンパイラ方式というべきでしょう。それでも、Mopsは普通のインタープリタのように、足し算一個でも、試してみることができるのです。 と、以上のように、技術的には色々あり得るわけです。Mopsの独特の方式(他にもForth系には類例はありますが)は、古いForth言語のやり方を踏襲して発展させたものです。このような、実質的にはコンパイラ方式なのに簡便にプログラミングができることを標準としている環境は、Forth系以外にはまだ存在していないようです。技術的にもとても興味深いものだと思います。 前へ 次へ 目次へ トップページへ
https://w.atwiki.jp/imops-forth/
はじめに 逐次拡張型インタラクティブ開発環境を作成しました。iMops (アイ・モップス)という名前です。無料ソフトウェアです。 ここからダウンロードできます。現在のバージョンは2.23です(2022/2/5)。 Macintoshコンピュータ(MacOS[X])専用ですが、相当程度最適化されたx86-64マシンコードを生成します。インタラクティブに一語一語(=各関数毎に)コンパイル-解釈実行できます。JITコンパイラとかいうものになるのでしょうか。Cocoaなど一般の動的フレームワークにリンクできます。単独で起動可能なアプリケーションを作ることもできます。64ビットのみですが動的ライブラリも生成できます。最新のmacOS上でも稼働するようです(確認済)。(なお、Apple社が、Macの全CPUを二年でARM仕様に変更すると宣言したことに対応して、ARM64ビットネイティブのMopsの開発計画が進行中です。) 専門家でも技術者でも学生でもプログラミング言語オタクでもないもの(自分)がそんなことをするのは、ひょっとしたら珍しいことなのかも知れないと思い、何かの役に立つかも知れないと考えて、ここにアレコレ書き留めることにしました。コンパイラは特に専門家でなくても1人でつくれるのだよ、と。(いずれ、iPadやWindows、Linux機にもポートしたいです。ARM型のCPU(Apple Silicon)へのネイティブ化はMichealさんが進めています。新しい理論で効率化されたコンパイラなので、かなりの高性能が期待できます。当面はRosettaで動くかも知れませんが、iMopsは一応の役割を終えることとなります。) 言語はForth(フォース)を基盤としたオブジェクト指向言語Mops(モップス)です。自前で設計した言語ではありません。 Forth言語(Fortranではありません)はご存知ない方も多いかも知れません — ウン十年前はかなり有名だったようなのですが — が、かなり特殊な言語で、標準的なプログラミング言語理論で当然の前提とされている事柄から離れてみないと、なかなかその特性は理解しにくいようです。ですが一旦わかってしまえば、これほど単純明快で簡単な言語も少ないのではないかと思います。知識豊富な方はアレコレ喧伝されている特徴をご存知かもしれませんが、ここで対象とするものは汎用開発環境で、上でも触れたようにマシンコードコンパイラ方式であって、GUIアプリケーションでも、他言語のインタープリタ/コンパイラでも、コンピュータソフトウェアなら基本的に何でもつくることができます。実際、iMopsもPowerMops(PowerPCネイティブのMops)上で構築されました(他にコンパイラは使っていません)。クロスコンパイルなどとも呼ばれるようです。現在はiMopsの核部分はiMops自身で構築されています。セルフコンパイルということになります。そのようなわけで、実装に利用する言語も実装される言語もMopsということになります。 Mops言語はそれ自体で成熟した言語であってforthのオブジェクト指向拡張とは最早いえません。forthの完備なスーパーセットとなることを意図したものでもありません。ですが、Mops開発環境はforthのごく基本的な部分であればそのままコンパイル・実行することができます(コア、およびコア エクステンションに属するワードは完備)。インタラクティブ開発環境であるため、簡単なテキストエディタは組み込まれていますが、ある程度長いプログラムを書いて保存するにはテキストエディタが必要です。普通のテキストエディターがあればソースコードを書くことはできます(UTF-8推奨)が、iMops上で構築された簡単なテキストエディタ(iBucket)も付属しています。Apple Eventよる通信機能もついているので、ごく単純なIDEとなっています。文字コードは、英語アルファベットの互換性を考慮して、内部的にはUTF-8で動作するようになっています。漢字ひらがなの文字列もワード名も可能です。(日本語入力を受け付けるforth系環境はあまりないらしいので、ちょっと宣伝。) Mopsのオブジェクトは、グローバルデータ域(辞書)にも、スタックフレーム内にも、ヒープブロックにも生成することができます。ヒープオブジェクトに対応してガーベージ・コレクター機能もついています。Mopsのオブジェクト指向システムで最も特徴的なのは、メッセージのバインド方法が、静的束縛、動的束縛1(VTable)、動的束縛2(キャッシュ付き検索)の三つの中から、呼び出しの形式で任意に選択できることです。加えて、インスタンス変数のそれぞれが一個のクラスの機能を完全に備えており、静的束縛でもメッセージを送ることができるため、クラスの中に別のクラスを埋め込むかのような働きが得られます。そして、インスタンス変数間相互のメッセージの交換も実行速度のペナルティー無しで行うことができます。こういった特徴を利用して、Mopsでは非常に柔軟で軽快高速なオブジェクト指向プログラムを作成することができるのです。また、単独実行可能なアプリケーションを構築する機能もついています。実際、付属のiBucketはその方法でビルドされました。 なお、コンピュータ科学界隈でMOPsというと、メタオブジェクトプロトコルズ(Metaobject Protocols)ということになるようです。ですが、こちらの"Mops"という名前は、開発者であるMichael Horeさんによれば、Mike s object-oriented programming system から採ったとされています。 そのように命名についてはメタオブジェクト・プロトコルと相互関連はないとされていますが、実は内容的には奇しくも深く関連しているようです(私見)。メタナントカに言及するときはMOPと全部大文字にして、こちらの言語の方はMopsと、最初だけ大文字で書くということにします。 ともあれ、Forth言語の基本なども含めて、だらだら書き足していくこととします。 メニュー 追記: Forth言語の入門書は、日本語のものは全て絶版で古書も高価なようで、また、ネットをみても、Forth言語に関して日本語の概説的なものは、ちょっと手薄なのではないかという気がしました。(いや、結構あるな。まあ、いいか。) そこで、僭越ながら、Forth言語の概説のようなものを書くということをここで試みてみようと思います。というより、中心をそちらにシフトしようかな、と。 最新の規格候補(Forth200x)を基としつつ、Mops(原型はForth83に準拠)の変異を混ぜるという方式でいきたいと思います。実装法についても書きます。 Forthは仕様が簡単な言語だから、、、とか思って始めたけれども、書いてみると長くなってしまうのである。ふむ。それより誰か見る人いるんですかね.. Forth解説の本を出してみたいなあ。需要は無いでしょうけど。 さらに追記: Mopsの紹介をしているホームページのサービスが終了してしまうそうなので、ここの姉妹サイトとして作り始めました。 Nao's Mops Page @wikiとなります。有用と思われるものは一応すべて移動しました(2019/1/17)。 Forth言語概説Forth開発環境の初歩的使用法 一般forth用語の整理 計算 Forthの変数 Forthの変数(続)、定数 数値演算 ビット、論理演算および比較判定 スタック操作 ワード(関数)の定義 ワード(関数)の定義(続) 文字列・印字・クエリ 固定文字列 文字列とASCII文字の印字 数値の表記と印字 文字列操作 forth環境への問い合わせ 特別スタックと小数 リターンスタックと小数スタック 浮動小数点数の処理 局所変数(locals) フロー IF、EXIT、CASE 確定ループ 不定ループ 再帰(RECURSE) データ・コードXT(エグゼキューション・トークン) ディクショナリ格納 CREATE DOES コンパイラ変形POSTPONE IMMEDIATE EVALUATE PARSE コンパイルの中断 エラーハンドリングAbort, Die, および Throw-Catch Forth実装についてスレッディング技術 (Threading Technology)
https://w.atwiki.jp/charolles/pages/39.html
コンパイラ構成まとめ 前置 + a b 中置 a + b 後置 a b + 最左導出 毎回一番左から処理する 例 1, S - S + S 2, S - i i + i は S - (1) S + S - (2) i + S - (2) i + i 最右導出も同様 左解析列 最左導出の規則番号列(上の例だと122) 静的マシン A jumpc N Aが偽ならNに飛ぶ loadn 数字 数字をloadする load mem memをloadする 動的マシン load 番号 相対 store 番号 相対 call 番号 先頭 return 番号 パラメータ数
https://w.atwiki.jp/fmemo/pages/16.html
ifortのコンパイルオプション g95のコンパイルオプション エンディアンを指定したいときifort g95 Fortranデバッグ用オプション 実行時に引き数を渡したいとき 整数のサイズ doループの仕様 内部入出力文 参考になるサイト ifortのコンパイルオプション 倍精度オプション $ ifort -r8 test.f90 デバッグオプション。これをつけないと配列の領域外参照をしていてもエラーにならないことがある。最適化オプションと併用するとエラーが起きるかもしれない? $ ifort -CB -traceback -g -check test.f90 書式無しファイル入出力でreclの単位を1byteにするとき。 $ ifort -assume byterecl test.f90 g95のコンパイルオプション デバッグしたいとき。 $ g95 -g -Wall -fbounds-check -ftrace=full test.f90 エンディアンを指定したいとき ifort 環境変数FORT_CONVERTn(nは数字)をBIG_ENDIANまたはLITTLE_ENDIANにすると、その装置番号で開いているファイルのエンディアンの扱いを変更できる。 $ FORT_CONVERT10=BIG_ENDIAN # 装置番号10番をBIG_ENDIANにしたいとき $ FORT_CONVERT15=LITTLE_ENDIAN # 装置番号15番をLITTLE_ENDAINにしたいとき すべてのエンディアンを一括して指定したいときは以下のオプションをつける -convert big_endian -convert little_endian g95 環境変数G95_ENDIAN=BIG, G95_ENDIAN=LITTLEを使う。 Fortranデバッグ用オプション 実行時に引き数を渡したいとき iargc, getargを使えばよい。これは非標準だが多くのコンパイラで使える。 program main implicit none integer i integer iargc, num character(128) var ! iargcは引数の数を返す関数 num = iargc() write(*,*) num ! getargは引数を返すサブルーチン do i=1,num call getarg(i,var) write(*,*) trim(var) enddo stop end program $ ./iargc_getarg.exe Anne Beth Chris 3 Anne Beth Chris ちなみに、0番目には"./iargc_getarg.exe"が入る。 参考サイトfortran備忘録 整数のサイズ integer(1)=1バイト整数 -128〜127 doループの仕様 do i=1,10 .... enddo のdoループが終わった直後のiの値は11 内部入出力文 character(64) char char= 100 200 read(char,*) num1, num2 write(*,*) "num1= ", num1 program main implicit none integer i,num character(100) fmt,cnum real(8) var i=4 num = 4 var = 1.23456 write(cnum, (i2) ) num write(*,*) trim(cnum) fmt = ( //trim(cnum)// f10.4) write(*,*) trim(fmt) write(*,fmt) var,var,var,var stop end program main 参考になるサイト Fortran縦々横々 Fortranの玉手箱
https://w.atwiki.jp/magicman/pages/22933.html
コンパイラ UC 水 (1) クリーチャー:サイバーロード 2000 ■このクリーチャーをバトルゾーンに出した時、相手の墓地から好きな枚数のカードを選び、裏向きにしてそれぞれ別の新しいシールドとして持ち主のシールドゾーンに加える。1枚も選ばなければ、このクリーチャーを手札に戻す。 作者:はんむらび 相手の墓地をシールドに埋めるデメリットを持つ1マナサイバーロード。 どれを埋めるか、またどれを埋めないかは任意だが、最低1枚は埋めないと手札に戻る。 基本的に使いづらいが、以下のような使い道はある。 5枚目以降の《アクア忍者 ライヤ》。自身の他のクリーチャーは戻せないが似たような性能。 相手の墓地利用妨害。シールドを割らないタイプのデッキなら山札に戻す《埋め立てロボ コンクリオン》などより再利用しづらいゾーンに送れる。とくにキーカードをシールドに埋めてしまえば相手の動きはかなり制限できる。 相手のシールドに任意のカードを仕込む。《無限王ハカイ・デストロイヤー》、《陽炎の守護者ブルー・メルキス》、《天革の騎皇士 ミラクルスター》などで踏み倒す呪文を用意できる。 相手のシールドを増やす。《「必勝」の頂 カイザー「刃鬼」》の効果回数の水増し。 など。基本的にコンボ向き。 フレーバーテキスト 君が望むこと、すべて実行してあげようね ―《コンパイラ》 評価 名前 コメント
https://w.atwiki.jp/mynote/pages/10.html
Fortran Fortran FFTプログラム以下簡単な使い方 Gnu fortran77 コンパイルオプション Fortranのデータ型 「'」「"」シングルクォーテーションとダブルクォーテーション Fortran90の2連コロンとは・・・? Option説明 Tips format文 エラーメモこれはmain.fにendを入れていなかったとき出たエラー・・・最低ですね ファイル名をcip.fじゃなくてcpi.fにしてmakeしてたときに出たエラー・・・ (^)病人の本質的な'COS'の参照--1つ以上の議論には、不正確なタイプがあります。 型の宣言がおかしい、i,jはinteger(整数型)・・・当然cos()の中はflot commonファイルにistepというのがあってIntegerだよ! f(i,j)とかのi,jが設定値を超えると出るエラーらしい Permissionつまり実行権限の問題!(chmod -777 で変えてやればいいときもあるが、なぜそのパーミッションになってしまっているかが問題) COMMON分メモ http //www.jp.freebsd.org/cgi/mroff.cgi?sect=1 cmd= lc=1 subdir=man dir=jpman-6.0.0%2Fman subdir=man man=f77 FFTプログラム k-spaceを見るときフーリエ変換を用いるが、普通にフーリエ変換をしていくと何日かかるかわからない。そこで使用するのがFFT(Fast Fourier Transform=高速フーリエ変換)である! 数値計算結果の解析を行う上で数多あるFFTの内1つぐらいはFFTライブラリを使用できるべきであろうと思う。 http //www.kurims.kyoto-u.ac.jp/~ooura/fftman/ 以下簡単な使い方 http //www20.atwiki.jp/mynote/pages/81.html Gnu fortran77 コンパイルオプション $g77 -O3 -ml -o acip.out -g -Wall acip.f O3 最適化オプション 「Option Level 3」の意味 ml Mathe libraryの使用(C言語やSin等の関数を仕様するとき必要かも) Wall -Wunused と -Wuninitialized オプションの結合(Wから始まるオプションを全てと言う意味) Fortranのデータ型 Integer型10桁 整数(4Byte)だから2^(4*8)で+ーある訳だから/2が最大値format文はI10で 2147483647(0を含む)~-2147483648 「 」「"」シングルクォーテーションとダブルクォーテーション print文などで文字列を扱う場合には、文字列をシングルクォーテーション( ) またはダブルクォーテーション( " )でくくります。シングルクォーテーションでくくるかダブルクォーテーションでくくるかでは多少意味が異なります。シングルクォーテーション( )でくくった場合は、そのままの文字として扱われます。 例) print そのまま\n出力します ;- [表示]そのまま\n出力します ダブルクォーテーション( " )でくくった場合は、メタ文字(\+アルファベットで制御コードなどを表す文字)や 変数等を挿入して扱う事ができるようになります。 例) print "メタ文字を\n出力します";- [表示]メタ文字を(ここに改行コードが入る)出力します 状況に応じて使い分けるしかないのですが、全角の表示でShiftJISを使用する場合に、 「ソ」や「表」といった文字は2バイト目が \ と同じコードとなり、文字が化ける場合が あるため、全角の表示はシングルクォーテーション( )でくくる方が無難です。 Fortran90の2連コロンとは・・・? 2連コロンを使った宣言方法あります。「integer c」と書きます。これまでに紹介した方法と、どこが違うのでしょうか。一つは、宣言に加えて初期値の設定ができるという点です。今までは初期値の設定は、宣言文で宣言した後、算術代入文やDATA文で値を入力する方法しかありませんでした。しかしこの宣言方法の場合、「integer a=4」というように、宣言の段階で値の入力ができるのです。これにより、書く量が少なくなり、aの扱われ方が非常に分かりやすくなります。C言語では宣言+入力は当たり前のことなのですが、Fortran77の段階ではこれは不可能でした。もう一つの利点は、宣言を複数重ねることができるのです。例えば、後の章で学ぶ「配列」の宣言文である「DIMENSION文」がありまして、今までは「integer g」の後に、「dimension g(20)」と書いていました。2連コロンの宣言方法を使うと、これと型宣言文を一つにまとめて、「integer,dimension(20) g」(宣言文同士の間にカンマが入ります)とすることができます。慣れるとこの宣言方法ばかり使用します。では、練習してみましょう。 Option説明 -O3 最適化を行います。最適化コンパイルは幾分長めの処理時間と、大きな関数に対する非常に多くのメモリを必要とします。これ以上の最適化オプションについては GCC ドキュメントを参照して下さい。特にループ展開は典型的な数値計算の Fortran プログラムにとっては調べる価値があるかも知れません。 -o file 出力先を file に指定します。 -g オペレーティングシステムのネイティブのフォーマット (DBX, SDB,DWARF) でデバッグ情報を生成します。GDB はこのデバッグ情報に基づいて動作することができます。 DBX フォーマットを使用するほとんどのシステムにおいては、`-g を指定すると、GDB だけが使用できる余分なデバッグ情報が使用可能になります。他の多くの Fortran コンパイラと異なり、GNU Fortran は `-g を `-O とともに使用することを許しています。最適化されたコードが通る近道は、時には驚くべき結果を生み出すかもしれません。定義したはずの変数が存在しなかったり、制御の流れが予想もしなかった場所に移動したり、結果が定数とわかる計算や、結果がすでに手元にある文は実行されなくなり、ある文がループの外に追い出されて別の場所で実行されたりします。それにも関わらず、このオプションは最適化された出力のデバッグを可能としています。これによって、バグを含むかもしれないプログラムに対してオプティマイザを使用することができるようになります。 -Wall たとえマクロとの組み合わせであっても、避けたほうがいいと我々が推奨する用法や、簡単に避けることができると我々が信じている用法に関する場合に警告します http //www-lab.imr.tohoku.ac.jp/~t-nissie/computer/c-tips/#section4 Fortran は write 文を 1 回実行する度に改行を行う。 (1) do i=1,n write(6,*) a(i) end do (2) write(6,*) (a(i),i=1,n) では異なる結果となります。(1) では一つの要素毎に改行するのに対して、(2) では全ての要素を空白で繋げて出力したのち改行します。 Tips http //docs.sun.com/source/806-4841/representations.html その四「Fortran WRITE文で改行させない方法」 FortranであるWRITE文で改行せず, その次のWRITE文で同じ行に書き続けたいときには書式 (FORMAT) の最後に$を付ける. こんなかんじ program suppress_new_line implicit none write(6, (a,$) ) abc write(6, (a) ) def write(6, (a) ) ghi end program suppress_new_line その五「Fortran 文字列をつなげる方法」 Fortranで二つの文字列をつなげるには//を使う. こんなかんじ implicit none character*1 a,b,c,d character*1 e character*2 f a = X b = Y c = U d = V write(6, (a) ) a // b e = (c // d) f = (c // d) write(6, (a) ) e write(6, (a) ) f end format文 format 文を使うと文番号を使う必要があります。以下のようにすると format 文を使わずに済ませることが出来ます。 write(6, (a,f8.5,a,i3.3) ) a = ,a, i = ,i format 文を使わないことにより、プログラムの cut paste のときに文番号の衝突を気にしなくて済みます。なお、上の例の i3.3 は 3 桁で出力し、それに満たない場合は 0 を補うと言う意味です。 エラーメモ 1 main.f In program `MAIN__ main.f 9 call init ^ End of source file before end of block started at (^) make *** [main.o] Error 1 utmcc000 ~/programs/zalesak02/zal_source SaitouDaisuke$ これはmain.fにendを入れていなかったとき出たエラー・・・最低ですね 2 make *** No rule to make target `cip.f , needed by `cip.o . Stop. ファイル名をcip.fじゃなくてcpi.fにしてmakeしてたときに出たエラー・・・ 3 Reference to intrinsic `EXP at (^) invalid -- one or more arguments have incorrect type init.f 26 f(i,j) = (1/sqrt(2.0*3.141))*EXP(-(j**2)/2)*(1+0.01*cos(i/2)) ^ Reference to intrinsic `COS at (^) invalid -- one or more arguments have incorrect type (^)病人の本質的な COS の参照--1つ以上の議論には、不正確なタイプがあります。 型の宣言がおかしい、i,jはinteger(整数型)・・・当然cos()の中はflot 4 g77 -c -O init.f init.f In subroutine `init parameter.h 1 warning common f(0 im,0 jm),fs(0 im,0 jm), fss(0 im,0 jm), ^ Padding of 4 bytes required before `dt in common block `_BLNK__ at (^) -- consider reordering members, largest-type-size first common /a/ f(0 im,0 jm),fs(0 im,0 jm), fss(0 im,0 jm), gx(0 im,0 jm), gsx(0 im,0 jm), gssx(0 im,0 jm), gv(0 im,0 jm), gsv(0 im,0 jm), gssv(0 im,0 jm), fn(0 im,0 jm), gnx(0 im,0 jm), gnv(0 im,0 jm), es(0 im), v(0 jm), x(0 im), istep, dt, dx, dy, sum commonファイルにistepというのがあってIntegerだよ! 5 h153 ~/programs/CV2_2DCIP/fortran se$ make make Circular main.f - main.f dependency dropped. make Circular input.f - input.f dependency dropped. make Circular output.f - output.f dependency dropped. make Circular acip2d.f - acip2d.f dependency dropped. make Circular poisson.f - poisson.f dependency dropped. g77 main.f input.f output.f acip2d.f poisson.f -o cv2 ./cv2 make *** [run_main] Segmentation fault f(i,j)とかのi,jが設定値を超えると出るエラーらしい 6 h153 ~/programs/CV2_2DCIP/fortran se$ make make Circular main.f - main.f dependency dropped. make Circular input.f - input.f dependency dropped. make Circular output.f - output.f dependency dropped. make Circular acip2d.f - acip2d.f dependency dropped. make Circular poisson.f - poisson.f dependency dropped. g77 main.f input.f output.f acip2d.f poisson.f -o cv2 ./cv2 make Permission to access file denied Permissionつまり実行権限の問題!(chmod -777 で変えてやればいいときもあるが、なぜそのパーミッションになってしまっているかが問題) ____ COMMON分メモ 便利なツールとして、次は「COMMON」文を紹介しましょう。ただ、余り使用は進められません。理由は、次章でお話しますが、COMMON文にはいろいろと問題が多いのです。これと同じ機能を持ち、かつ安全なモジュール(次章)がFortran90には用意されているので、あくまでFortran90 の人は、モジュールを使用するようにしてください。ここでのCOMMON文の紹介は、Fortran77人向けや一応の紹介だと受け止めてください。 COMMON文というのは、宣言した変数を、大域要素と使用、というものです。大域要素というのは、局所要素の反対で、どのプログラム単位においても有効な要素のことです。これまでは、主プログラムで宣言した変数と同じ名前の変数を副プログラムで使用していたとしても、それらは見かけ上同じでもまったく別の変数でしたね。主プログラムで「x」を使い、副プログラムでも「x」を使ったとしても、それらはx1とx2のように別の変数でした。このCOMMON 文を使用すると、それらが同じ「x」になるのです。同じ変数なので、型宣言をする必要がなくなります。変数全てに対して型宣言を再びしなくてもよくなるというのは、仮引数が多ければ多いほどありがたみを感じます。 使用方法は、まず主プログラムでCOMMON文を使用して、大域要素として変巣を定義します。「common /変数群の名前(領域名)/変数群」と書きます。領域名というのは、COMMON文を使用すると、「この領域にある変数が大域要素ですよ」ということを示す共通領域(ブロック)が作られます。その名前を、領域名のところに書きます。領域名は必須ではなく、書かなくても構いません。変数群を2種類以上に分け、それぞれに違った領域名をつける場合は、「common /p/a,b/q/c,d」のように、一つの領域名、変数群を書き、スラッシュを間に挟んで2つ目の領域名、、変数群を書いていきます。 br 2; COMMON文を使用すると、主プログラム・副プログラムの実・仮引数が不要となります。また、先ほども申し上げたとおり、型宣言をしなくてすむようになります(配列宣言は必要ですが)。副プログラムにおいて、使用する変数を、「common /領域名/使用する変数」のように定義します。これで、何が引数になるのかを示すわけですね。COMMON文を使用した例が、下の例文です。 program main common /p/a(5),xmax,xmin integer a,xmax,xmin print *, 最大値と最小値を求める。5個値を入力 read *,a(1 5) call sub print *, 最大値 ,xmax, 最小値 ,xmin end program subroutine sub common /p/a(5),xmax,xmin xmax=maxval(a,1) xmin=minval(a,1) end subroutine sub この例では、「a(5),xmax,xmin」を変数群、「p」を領域名とする共通ブロックを作成しました。領域名は省略可能です。これにより、 SUBROUTINEを使用する際の引数と、副プログラム内での型宣言が省略されています。ちなみに、COMMON文において配列宣言がなされているので、主プログラムでの型宣言時に「integer a(5)」という配列宣言は不要です。 しかし、COMMON文は使いづらい面があります。それは、副プログラム内で使用する際には、COMMON文を書くときに、変数の並び順を買えずにそのまま書かなければならない、ということです。この場合ですと、「common /p/a(5),xmax,xmin」というのを、「common /p/xmax,a(5),xmin」としてはいけない、ということです。COMMON文で変数を共通利用する際のその方法というのは、変数の名前ではなく、変数の並び順なのです。副プログラムに書かれたCOMMON文の変数の並び順に、主プログラムでのCOMMON文の並び順が適用されてしまうのです。ですから、副プログラムで「common /p/xmax,a(5),xmin」と書いてしまうと、「xmax」は主プログラムの「a(5)」に、「a(5)」は主プログラムの「xmax」になってしまうのです。名前でなく順番で変数を対応させているので、「common /p/y(5),c,i」でも可能です。この、並び順を正確に書かなければならないというのが、COMMON文の使いづらさです。 次は、「INTENT」と「OPTIONAL」です。共に仮引数に対して使います。INTENTから説明しましょう。INTENT文は、仮引数が主プログラムからの値や副プログラムで求めた値に対し、どう対応するのか、ということを決める文です。仮引数は、値に対する対応で3種類に分かれます。1つ目は、副プログラムでの計算をするために、主プログラムから必要な値を実引数から受け取ると言う、入力のみの引数です。2つ目は結果変数のことで、副プログラムで求めた値を、実引数に渡す、出力のみの引数です。3つ目は、今までは1回ぐらいしか出てこなかったと思いますが、入力も出力もこなす引数です(例えば、「a=a+2」のみが副プログラムでの計算であれば、、「a」は右辺で入力をし、左辺で計算結果を受け取って主プログラムに出力しています)。副プログラムで使用する仮引数が、この3つうちのどれなのかをコンピュータに対して明示的にするのが、INTENT文です。 使い方はいたって簡単です。副プログラムでの変数の型宣言のときに、「intent(属性)」を書けばいいだけです。先ほどの3つのうち、1つ目は属性が「in」、2つ目は「out」、3つ目は「inout」となります。例えば、整数型で入力のみの仮引数nの宣言文は、「integer,intent (in) n」と書きます。 この文は使用しなくても、副プログラムが3つのうちどれなのかを自動的に判断してくれますので、今までの仮引数の宣言の仕方は間違ってはいません。しかし、コンピュータといえども、先ほどのEXTERNALでの関数の間違いと同じように、仮引数の属性を間違ってしまうことがあります。自分では1番目の属性としてプログラムを組んでいるのに、コンピュータが3番目だと判断してしまい、おかしな実行結果になることがあることは考えられます。ですから、そうしたエラーを出さないようにするためには、INTENT文を使用してその属性をはっきりさせることが大事だということです。また属性を宣言することにより、プログラマ自身にとっても、その変数の役割をしっかりと認識することができます。 2つ目のOPTIONAL文は、対象の引数に省略可能を認める機能を持つ文です。副プログラムは実引数と仮引数の個数が一致するように書きますが、場合によっては省略できたほうが便利になることがあります。3つの引数を入力用として受け取る副プログラムがあるとしましょう。その副プログラムはこの3つを使って計算処理をするわけですが、2つに引数が減ったとしても、ほとんどの部分が3つの場合と同じ処理で可能だと分かりました。どうせほぼ同じ処理しかしないのであれば、わざわざ引数が2つ用の副プログラムをもう一個余分に作るよりも、3つ目の引数を省略可能な引数にして、引数が2つでも3つでも対応可能な副プログラムを作ったほうが簡単です。それを実現するのが、OPTIONAL文です。 引数を省略可能にするには、型宣言文にOPTIONAL文を追加します。例えば、「real,optional r」です。ただ、これだけでは不完全で、主プログラムにおいて、「INTERFACE」宣言をする必要があります。これは、INTERFACE文を使用して、「この副プログラムでは、この仮引数が使われていて、かつこの引数は省略可能なものとする」ということを宣言するのです。下の例をご覧ください。INTENTも一緒に使用しています。 program main implicit none interface real function f(x,y,z) real,intent(in),optional z real,intent(in) x,y end function f end interface integer n real x,y,z,kyori,f print *, 原点からある点までの距離を求める。ある点の次元数(2か3)を入力 read *,n if(n==2)then print *, 2次元で、ある点の座標を入力 read *,x,y kyori=f(x,y) print *,kyori else print *, 3次元で、ある点の座標を入力 read *,x,y,z kyori=f(x,y,z) print *,kyori endif end program real function f(x,y,z) real,optional z real x,y f=x**2+y**2 if(present(z))f=f+z**2 f=sqrt(f) end function f INTERFACE宣言は、PROGRAM文やFUNCTION文のように、END分が付いて、ここで宣言を閉じます。INTERFACE宣言の中には、副プログラムの先頭と、変数の宣言文をそっくりそのまま書きます。書いたらEND文で副プログラムを閉じるのを忘れないようにしてください。これにより、「z」は省略可能な引数になります。ですから、副プログラムを呼ぶときに、実引数が「x」と「y」だけでも、また「z」を含めても、同じ副プログラムで対応することができます。 副プログラム中にある「PRESENT」文は、省略可能な引数が今現在副プログラム中に存在しているかどうかを問い合わせる組み込み関数です。存在していれば真を返します。このプログラムの場合、「z」を引数として渡していれば、「f=f+z**2」、つまり「f=x**2+y**2+z**2」が行なわれることになります。 h153 ~/programs/CV2_2DCIP/fortran saitoudaisuke$ make make Circular main.f - main.f dependency dropped. make Circular input.f - input.f dependency dropped. make Circular output.f - output.f dependency dropped. make Circular acip2d.f - acip2d.f dependency dropped. make Circular poisson.f - poisson.f dependency dropped. g77 main.f input.f output.f acip2d.f poisson.f -o cv2 /usr/bin/ld Undefined symbols _MAIN__ collect2 ld returned 1 exit status make *** [cv2] Error 1 h153 ~/programs/CV2_2DCIP/fortran saitoudaisuke$ 判らんエラーだ???2010-02-03
https://w.atwiki.jp/mina2000gt/pages/49.html
Windows 7上でFortranをコンパイルしたい
https://w.atwiki.jp/chocolate1120/pages/57.html
インプリタ インタプリタとは同時通訳つまり、プログラムを1行ずつ実行する 短所:遅い インタプリタがないと実行できない。 長所:エラーがあったときに、どこにそのエラーがあるのかわかりやすい(デバックしやすい) 機能に依存することなく実行できる(インタプリタさえあればそれぞれのCPUに対応できる) コンパイラ コンパイラとは、翻訳。つまり、プログラムを全文マシン語コードに変換する。 短所:一個でも文法エラーがあると,全体の翻訳は失敗するためどこでえらーがあるのかわかりにくい(デバックしにくい) マシン語なのでCPUが違うと実行できない。 長所:速い 1回ロードモジュールまで持っていくと実行可能なため、何も必要ない。(インタプリタの様ではない) ライブラリ